package com.example.xmldemo;

import android.app.Person;
import android.text.TextUtils;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class MyHandle extends DefaultHandler {
    private List<PersonModel> list;
    private PersonModel person;
    private String tag;

    public List<PersonModel> getList() {
        return list;
    }

    public void setList(List<PersonModel> list) {
        this.list = list;
    }

    //获取数据
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        //由于缓存标签可能为空，先判断
        if (!TextUtils.isEmpty(tag)) {
            switch (tag) {
                case "name":
                    person.setName(new String(ch, start, length));
                    break;
                case "age":
                    person.setAge(new String(ch, start, length));
                    break;
            }
        }
    }
//文档解析开始
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        list=new ArrayList<>();
    }
//文档解析结束
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();


    }
//标签开始
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //扫描到开始标签为<person>时，创建list元素，并获取属性
        if(localName.equals("person")){
            person=new PersonModel();
            person.setId(attributes.getValue("id"));
        }
        //通过成员变量tag,缓存标签，用于在characters()方法中判断当前标签
        tag=localName;
    }
//标签结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        //由于列表中多条数据结构相同，所以解析结束一条person数据后，需要将person对象置空
        if(localName.equals("person")){
            list.add(person);
            person=null;
        }
        //因为有多个标签需要缓存标签名，tag会被重复赋值，所以在一条person数据解析完成后，tag需要置空
        tag=null;
    }
}
